﻿/** 自定义的常用函数的类,属于专门函数的合集,不可新建实例,所有函数作为类函数使用
  By setycyas @2023-01-31 17:37
*/

class MyFuns {

  /* 可供外部调用的函数  
  */
  ;把字符串转换成全大写或小写
  toLowerCase(str){
    local result
    StringLower, result, str
    return result
  }
  toUpperCase(str){
    local result
    StringUpper, result, str
    return result
  }

  ;从热键符号中获取真实热键.因为设定热键时使用的热键符号可能带有其他字符,目前只对应了前置的~字符.
  getHotkey(hotkeyStr){
    local result := hotkeyStr
    if (SubStr(hotkeyStr, 1, 1) == "~")
	  result := SubStr(hotkeyStr, 2)
    return result
  }

  ;创建一个array,初值为startValue,步长为step,终值在step为正数时小于等于endValue,在step为负数时大于等于endValue
  ;注意在默认step下,初值终值都能取到,这与python的range不同,是autohotkey风格的range
  range(startValue, endValue, step := 1){
    local v := startValue, result := []
    if (step == 0){
      return result
    }
    while (((step > 0) and (v <= endValue)) or ((step < 0) and (v >= endValue))) {
      result.push(v)
	  v += step
    }
    return result
  }

  ;把字符串数组strArr连起来,分隔符为seq
  join(strArr, seq){
    local result := strArr[1], n := strArr.Count()-1
    loop, %n% {
      result := result . seq . strArr[A_Index+1]
    }
    return result
  }

  ;设置热键,做成函数模式,方便热键使用表达式特别是数组
  ;isBlock参数是个布尔值,为+0时热键前加上~表示不阻碍热键本身
  setHotkey(hotkey1, label1, wTitle := "", isBlock := +0){
    local hotkeyName := hotkey1
    if (isBlock == +0) {
      hotkeyName := "~" . hotkey1
    }
    if (wTitle == "") {
      Hotkey, %hotkeyName%, %label1%
    } else {
      Hotkey, IfWinActive, %wTitle%
	  Hotkey, %hotkeyName%, %label1%
	  Hotkey, IfWinActive
    }
  }
  
  ;寻找一个数组的最大或最小值
  arrMax(arr){
    local result := arr[1], n := arr.Count()-1
    loop, %n% {
      if (arr[A_Index+1] > result) {
	    result := arr[A_Index+1]
	  }
    }
    return result
  }
  arrMin(arr){
    local result := arr[1], n := arr.Count()-1
    loop, %n% {
      if (arr[A_Index+1] < result) {
	    result := arr[A_Index+1]
	  }
    }
    return result
  }

  ;从数值或字符串中随机选择一项或一个字符
  randomChooseArr(arr){
    local randNum
    Random, randNum, 1, % arr.Count()
    return arr[randNum]
  }
  randomChooseStr(str){
    local randNum
    Random, randNum, 1, % StrLen(str)
    return SubStr(str, randNum, 1)
  }

  ;获取一个随机字符串,每一个字符可能是数字或小写字符,参数n为字符串长度
  getRandomStr(n){
    local result := []
    local randNum
    loop, %n% {
      Random, randNum, 1, 36 ;10个数字加26个小写字母,一共有36种可能
      if (randNum < 11) {
        result.push(Chr(randNum+47))
      } else {
        result.push(Chr(randNum+86))
      }
    }
    return MyFuns.join(result, "")
  }

  ;获取一个全局变量(不一定是global定义的,global定义的是超级全局变量)的值,参数是该全局变量的名称,是一个字符串
  ;此函数在动态绑定gui并大量使用字符串作为绑定gui的全局变量时有用,因为这些全局变量的名字可能储存在一个数组中
  getVarValue(vName){
    local v := %vName%
    return %v%
  }
  
}

/* 测试用

__MyFuns_test1(){
  msgbox, % MyFuns.toLowerCase("Abc-1")
  msgbox, % MyFuns.toUpperCase("Abc-1")
}

__MyFuns_test2(){
  local rangeArr := MyFuns.range(1, -5, -1)
  MsgBox, % MyFuns.join(rangeArr, "|")
}

__MyFuns_test3(){
  local arr1 := [1, 3, 8, 6, 10, 5]
  MsgBox, % MyFuns.arrMin(arr1)
  MsgBox, % MyFuns.arrMax(arr1)
}

__MyFuns_test4(){
  local str1 := "abc123"
  local arr1 := ["a", "b", "c", "1", "2", "3"]
  MsgBox, % MyFuns.randomChooseArr(arr1)
  MsgBox, % MyFuns.randomChooseStr(str1)
}

__MyFuns_test5(){
  MsgBox, % MyFuns.getRandomStr(10)
  MsgBox, % MyFuns.getRandomStr(8)
  MsgBox, % MyFuns.getRandomStr(5)
}

__MyFuns_test1()
__MyFuns_test2()
__MyFuns_test3()
__MyFuns_test4()
__MyFuns_test5()
*/
